from langchain_community.llms import Ollama
from config.index import Config
from pydantic import BaseModel
from typing import List

class Rule(BaseModel):
    rules: List[str]

class FormData(BaseModel):
    content: str

class LLMCheck:
    def __init__(self):
        self.cfg = Config()
        self.host = self.cfg.get('llm_check.host')
        self.model = self.cfg.get('llm_check.model')
        
        # 初始化 phi3 模型，不使用 streaming 输出
        self.llm = Ollama(
            base_url=self.host,
            model=self.model,
            temperature=0  # 使用更低的温度以获得更确定的答案
        )
    
    def check_rules(self, rules: Rule, form_data: FormData) -> dict:
        """
        检查表单是否符合规则
        :param rules: Rule对象，包含规则列表
        :param form_data: FormData对象，包含表单信息
        :return: 包含检查结果的字典
        """
        prompt = f"""[INST]你是一个专业的工作流程审批判断器。

任务：判断表单信息是否完全符合所有自动审批规则。

重要说明：
1. 数值比较时，需要精确到小数点后两位
2. 对于天数的比较：
   - "<=2天" 表示小于等于2.00天
   - 比如：0.46天、1.50天、2.00天都是合法的
   - 比如：2.01天、2.10天、3.00天都是不合法的
3. 对于类型的比较：
   - 完全相等才算匹配
   - 比如规则说"事假、婚假、产假"，表单填"事假"就是匹配的

自动审批规则：
{chr(10).join(f"{i+1}. {rule}" for i, rule in enumerate(rules.rules))}

表单信息：
{form_data.content}

判断规则：
- 如果表单信息完全符合以上所有规则，回答：yes
- 如果任何一条规则不符合，回答：no

注意：只能回答 yes 或 no，不要添加任何其他文字。

回答：[/INST]"""
        
        try:
            response = self.llm.invoke(prompt).strip().lower()
            print(f"LLM原始响应: {response}")
            first_word = response.split()[0] if response else ""
            result = first_word == 'yes'
            print(f"判断结果: {'通过' if result else '不通过'}")
            return {
                "success": True,
                "approved": result,
                "response": response
            }
        except Exception as e:
            print(f"LLM检查过程中发生错误: {e}")
            return {
                "success": False,
                "error": str(e),
                "approved": False
            }